<?php
/**
 * Arquivo de declara��o da classe ConexaoPdo
 * @package modelo
 * @subpackage dados
 * @author Jos� Berardo
 * @since 1.0
 */
/**
 * Classe abstrata ConexaoPdo que
 * representa a conex�o com o SGBD.
 * Ser� implementada como um Singleton.
 * @package modelo
 * @access public
 * @abstract
 */
class ConexaoPdo {
  /**
   * Inst�ncia �nica da ConexaoPdo.
   * Implementa��o do padr�o Singleton
   * @var ConexaoPdo $instancia
   */
  private static $instancia;
  
  /**
   * Objeto que manipular� a conex�o com o SGBD
   * @var PDO
   */
  private $db;
  
  /**
   * Construtor privado.
   * Só será executado uma única vez por script.
   */
  private function __construct() {
    try {
      $dados_ambiente = Controlador::getInstancia()->get('dados_ambiente');
      if ($dados_ambiente['banco']['sgbd'] == 'pgsql') {
      	$this->db = new PDO("pgsql:host={$dados_ambiente['banco']['host']} " . 
							"port={$dados_ambiente['banco']['porta']} " .
							"dbname={$dados_ambiente['banco']['database']} " . 
							"user={$dados_ambiente['banco']['usuario']} " . 
							"password={$dados_ambiente['banco']['senha']}");
      } elseif ($dados_ambiente['banco']['sgbd'] == 'mysql') {
      	$this->db = new PDO("mysql:host={$dados_ambiente['banco']['host']}; " .
      						"port={$dados_ambiente['banco']['porta']};" .
							"dbname={$dados_ambiente['banco']['database']}", 
							$dados_ambiente['banco']['usuario'], 
							$dados_ambiente['banco']['senha'],
							array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
      }
      $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch (PDOException $e) {
      throw new Exception($e);
    }
  }

  /**
   * M�todo que recupera a inst�ncia da classe ConexaoPdo
   * @return ConexaoPdo
   */
  public static function getInstancia() {
    if (!isset(self::$instancia)) {
      self::$instancia = new ConexaoPdo();
    }
    return self::$instancia;
  }
  
  /**
   * Retorna a conex�o com o banco
   * @return PDO
   */
  public function getDb() {
    return $this->db;
  }
}
?>